package num32III;

import java.util.*;

/**
 * @author : DuJiabao
 * @Date : 2021/1/22 17:39
 * @Project : sword-finger-offer
 * @File : null.java
 * @Desc :请实现一个函数按照之字形顺序打印二叉树，即第一行按照从左到右的顺序打印，第二层按照从右到左的顺序打印，第三行再按照从左到右的顺序打印，其他行以此类推
 * https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new LinkedList<>();
        Queue<TreeNode> arr = new LinkedList<>();
        if (root != null) arr.add(root);
        while (!arr.isEmpty()) {
//            巧用LinkedList
            LinkedList<Integer> temRes = new LinkedList<>();
            for (int i = arr.size(); i > 0; i--) {
                TreeNode temp = arr.poll();
                //巧妙一： 通过辨别res的行数，来辨别是奇数行还是偶数行。无需利用标志位
                //巧妙二： 通过巧用LinkedList，实现结果的往前加还是往后加。而无需通过修改队列顺序。
                if (res.size() % 2 == 0) temRes.addLast(temp.val);
                else temRes.addFirst(temp.val);
                if (temp.left != null) arr.add(temp.left);
                if (temp.right != null) arr.add(temp.right);
            }
            res.add(temRes);
        }
        return res;
    }
}
